package com.hxh.generater.common;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class TreeBuilder {

    public static List<GenSysMenu> buildTree(List<? extends GenSysMenu> menus) {
        // 获取所有菜单ID
        Set<Long> menuIds = menus.stream()
                .map(GenSysMenu::getId)
                .collect(Collectors.toSet());

        // 获取所有父级ID
        Set<Long> parentIds = menus.stream()
                .map(GenSysMenu::getParentId)
                .collect(Collectors.toSet());

        // 获取根节点ID（递归的起点），即父节点ID中不包含在部门ID中的节点，注意这里不能拿顶级菜单 O 作为根节点，因为菜单筛选的时候 O 会被过滤掉
        List<Long> rootIds = parentIds.stream()
                .filter(id -> !menuIds.contains(id))
                .collect(Collectors.toList());

        // 使用递归函数来构建菜单树
        return rootIds.stream()
                .flatMap(rootId -> buildMenuTree(rootId, menus).stream())
                .collect(Collectors.toList());
    }

    /**
     * 递归生成菜单列表
     *
     * @param parentId 父级ID
     * @param menuList 菜单列表
     * @return 菜单列表
     */
    private static List<GenSysMenu> buildMenuTree(Long parentId, List<? extends GenSysMenu> menuList) {
        return CollectionUtil.emptyIfNull(menuList)
                .stream()
                .filter(menu -> menu.getParentId().equals(parentId))
                .map(entity -> {
                    GenSysMenu sysMenu = new GenSysMenu();
                    BeanUtil.copyProperties(entity, sysMenu);
                    List<GenSysMenu> children = buildMenuTree(entity.getId(), menuList);
                    if (CollectionUtil.isNotEmpty(children)) {
                        sysMenu.setChildren(children);
                    }
                    return sysMenu;
                }).collect(Collectors.toList());
    }


}
